import { ref } from 'vue'
import type { EditorTab } from '../../../types/editor'
import type { AiTimelineEntry } from '../../../stores/aiTimeline'

/**
 * 编辑器模式控制器 - 统一管理编辑器模式切换逻辑
 * 
 * 功能：
 * 1. 提供统一的编辑器模式切换方法
 * 2. 处理AI diff模式和普通模式之间的切换
 * 3. 管理diffSideBySide、showingDiff等属性
 * 4. 支持模式切换的事件通知
 */

export interface EditorModeChangeEvent {
  tab: EditorTab
  fromMode: 'normal' | 'ai-diff'
  toMode: 'normal' | 'ai-diff'
  trigger: 'manual' | 'auto' | 'ai-timeline'
}

export function useEditorModeController() {
  // 模式变化回调列表
  const modeChangeCallbacks = new Set<(event: EditorModeChangeEvent) => void>()
  
  // 获取标签页当前模式
  function getCurrentMode(tab: EditorTab): 'normal' | 'ai-diff' {
    return tab.showingDiff ? 'ai-diff' : 'normal'
  }
  
  // 切换到AI diff模式
  function switchToAiDiffMode(
    tab: EditorTab, 
    aiEntry: AiTimelineEntry | null = null,
    trigger: 'manual' | 'auto' | 'ai-timeline' = 'auto'
  ): boolean {
    const fromMode = getCurrentMode(tab)
    
    if (fromMode === 'ai-diff') {
      // 已经是AI diff模式，无需切换
      return false
    }
    
    try {
      // 设置AI diff模式
      tab.showingDiff = true
      tab.diffSideBySide = false // 强制使用内联模式
      tab.justSwitchedToDiff = true // 标记刚刚切换到diff模式，用于控制自动选中行为
      
      // 设置diff内容
      if (aiEntry) {
        tab.systemHistoryDiff = {
          source: 'ai-timeline',
          id: aiEntry.id,
          originalContent: aiEntry.beforeContent || tab.savedContent || '',
          resourceUri: tab.path || ''
        }
        
        // 更新AI状态
        tab.aiStatus = {
          hasChanges: true,
          latestEntry: aiEntry,
          totalChanges: 1, // 这里可以根据实际情况调整
          kind: aiEntry.kind,
          tool: aiEntry.tool,
          timestamp: aiEntry.ts
        }
      }
      
      // 触发模式变化事件
      const event: EditorModeChangeEvent = {
        tab,
        fromMode,
        toMode: 'ai-diff',
        trigger
      }
      
      modeChangeCallbacks.forEach(callback => {
        try {
          callback(event)
        } catch (error) {
          console.warn('[EditorModeController] Mode change callback error:', error)
        }
      })
      
      console.log(`[EditorModeController] 切换到AI diff内联模式: ${tab.path} (trigger: ${trigger})`)
      return true
      
    } catch (error) {
      console.error('[EditorModeController] 切换到AI diff模式失败:', error)
      return false
    }
  }
  
  // 切换到普通模式
  function switchToNormalMode(
    tab: EditorTab,
    trigger: 'manual' | 'auto' | 'ai-timeline' = 'auto',
    force: boolean = false
  ): boolean {
    const fromMode = getCurrentMode(tab)
    
    if (fromMode === 'normal') {
      // 已经是普通模式，无需切换
      return false
    }
    
    // 检查是否应该切换（只有AI时间线触发的diff才能自动切换回普通模式）
    if (!force && tab.systemHistoryDiff?.source !== 'ai-timeline') {
      console.log(`[EditorModeController] 跳过切换到普通模式: ${tab.path} (非AI时间线触发的diff)`)
      return false
    }
    
    try {
      // 重置diff相关属性
      tab.showingDiff = false
      tab.diffSideBySide = undefined
      tab.systemHistoryDiff = null
      tab.diffModels = null
      
      // 触发模式变化事件
      const event: EditorModeChangeEvent = {
        tab,
        fromMode,
        toMode: 'normal',
        trigger
      }
      
      modeChangeCallbacks.forEach(callback => {
        try {
          callback(event)
        } catch (error) {
          console.warn('[EditorModeController] Mode change callback error:', error)
        }
      })
      
      console.log(`[EditorModeController] 切换到普通模式: ${tab.path} (trigger: ${trigger})`)
      return true
      
    } catch (error) {
      console.error('[EditorModeController] 切换到普通模式失败:', error)
      return false
    }
  }
  
  // 智能切换模式（根据AI记录自动选择）
  function smartSwitchMode(
    tab: EditorTab,
    hasAiRecord: boolean,
    latestEntry: AiTimelineEntry | null = null,
    trigger: 'manual' | 'auto' | 'ai-timeline' = 'auto'
  ): boolean {
    if (hasAiRecord && latestEntry) {
      return switchToAiDiffMode(tab, latestEntry, trigger)
    } else {
      return switchToNormalMode(tab, trigger)
    }
  }
  
  // 添加模式变化监听器
  function onModeChange(callback: (event: EditorModeChangeEvent) => void) {
    modeChangeCallbacks.add(callback)
    
    // 返回取消监听的函数
    return () => {
      modeChangeCallbacks.delete(callback)
    }
  }
  
  // 检查标签页是否处于AI diff模式
  function isInAiDiffMode(tab: EditorTab): boolean {
    return tab.showingDiff === true
  }
  
  // 检查标签页是否处于普通模式
  function isInNormalMode(tab: EditorTab): boolean {
    return !tab.showingDiff
  }
  
  return {
    // 模式切换方法
    switchToAiDiffMode,
    switchToNormalMode,
    smartSwitchMode,
    
    // 模式检查方法
    getCurrentMode,
    isInAiDiffMode,
    isInNormalMode,
    
    // 事件监听
    onModeChange
  }
}

export type EditorModeController = ReturnType<typeof useEditorModeController>